/**
 * ZHU framework. Copyright 2012-, all rights reserved.
 *
 * $Id: BusinessServiceMessage.java 12 2012-07-27 08:48:07Z zhuxiaopeng $
 * $Revision: 12 $
 * $Date: 2012-07-27 16:48:07 +0800 (五, 2012-07-27) $
 * $Author: zhuxiaopeng $
 */
package zhu.framework.service;

import java.io.*;

import zhu.framework.util.*;

/**
 * <p>
 * </p>
 * 
 * @author $Author: zhuxiaopeng $
 * @version $Revision: 12 $ - $Date: 2012-07-27 16:48:07 +0800 (五, 2012-07-27) $
 */
public final class BusinessServiceMessage implements Serializable, Comparable<BusinessServiceMessage> {

	private static final long serialVersionUID = 1L;

	/**
	 * <p>
	 * メッセージの深刻度を表す。
	 * </p>
	 * <h3>実装上の契約</h3>
	 * <p>
	 * 実装者は下記の契約（規約）を遵守しなければならない。
	 * </p>
	 * <h4>宣言順序</h4>
	 * <p>
	 * この列挙型の値の宣言順序は深刻度が高い順に宣言される必要がある。
	 * </p>
	 * <h3>スレッドセーフ性</h3>
	 * <p>
	 * このClassのインスタンスは不可変であるため、スレッドセーフである。
	 * </p>
	 * 
	 * @author $Author: Ryosuke Iwata$
	 * @version $Rev: 12 $ - $Date: 2007/12/26 22:15:32$
	 */
	static public enum Severity {
		/**
		 * 致命的なエラーを表す。
		 */
		FATAL,
		/**
		 * エラーを表す。
		 */
		ERROR;
	}

	/**
	 * <p>
	 * 指定された内容に基づきこのclassのインスタンスを初期化する。 {@link #getSeverity() 深刻度}には
	 * <code>{@link Severity#ERROR}</code>が、{@link #getDetail() 詳細メッセージ}には
	 * <code>null</code>が指定される。
	 * </p>
	 * <p>
	 * この呼び出しは
	 * <code>{@link #BusinessServiceMessage(educom.framework.service.BusinessServiceMessage.Severity, String, String) BusinessServiceMessage(ERROR, summary, null)}</code>
	 * と等価である。
	 * </p>
	 * 
	 * @param summary
	 */
	public BusinessServiceMessage(final String summary) {
		this(Severity.ERROR, summary, null);
	}

	/**
	 * <p>
	 * 指定された内容に基づきこのclassのインスタンスを初期化する。 {@link #getDetail() 詳細メッセージ}は
	 * <code>null</code>が指定される。
	 * </p>
	 * <p>
	 * この呼び出しは
	 * <code>{@link #BusinessServiceMessage(educom.framework.service.BusinessServiceMessage.Severity, String, String) BusinessServiceMessage(severity, summary, null)}</code>
	 * と等価である。
	 * </p>
	 * 
	 * @param sevirity
	 * @param summary
	 */
	public BusinessServiceMessage(final Severity sevirity, final String summary) {
		this(sevirity, summary, null);
	}

	/**
	 * <p>
	 * 指定された内容に基づきこのclassのインスタンスを初期化する。
	 * </p>
	 * 
	 * @param sevirity
	 * @param summary
	 * @param detail
	 */
	public BusinessServiceMessage(final Severity sevirity, final String summary, final String detail) {
		MyUtility.checkMethodParameterNotNull("severity", sevirity);
		MyUtility.checkMethodParameterNotNull("summary", summary);
		//
		this.severity = sevirity;
		this.summary = summary;
		this.detail = detail;
	}

	/**
	 * <p>
	 * メッセージの要旨を取得する。
	 * </p>
	 * 
	 * @return メッセージの要旨
	 */
	public String getSummary() {
		return summary;
	}

	/**
	 * <p>
	 * メッセージの深刻度を取得する。
	 * </p>
	 * 
	 * @return メッセージの深刻度
	 */
	public Severity getSeverity() {
		return severity;
	}

	/**
	 * <p>
	 * メッセージの詳細記述を取得する。 このプロパティは<code>null</code>であり得る。
	 * </p>
	 * 
	 * @return メッセージの詳細記述、または<code>null</code>
	 */
	public String getDetail() {
		return detail;
	}

	/**
	 * <p>
	 * オブジェクトを{@link Severity 深刻度}の順にソートするための順序づけを提供する。 この日各演算の結果は
	 * <code>{@link #equals(Object)}</code>及び<code>{@link #hashCode()}</code>
	 * による比較と互換性がない。
	 * </p>
	 */
	@Override
	public int compareTo(final BusinessServiceMessage o) {
		return this.getSeverity().compareTo(o.getSeverity());
	}

	@Override
	public String toString() {
		final ToStringBuilder builder = new ToStringBuilder(this.getClass());
		builder.append("severity", getSeverity());
		builder.append("summary", getSummary());
		builder.append("detail", getDetail());
		//
		return builder.toString();
	}

	private final Severity severity;
	private final String summary;
	private final String detail;

}
